package com.yanxu.threadandobjectmethods.pruducerconsumer;

import java.util.LinkedList;
import java.util.Random;

/**
 * @author 折戟沉沙铁未销
 * @version V1.0
 * @date 2025/3/20-2025
 * @Description: 使用 wait、notify 实现生产者 、消费者模式
 */
public class WaitNotify_ProducerConsumer {
    public static void main(String[] args) {
        //仓库
        final Storehouse storehouse = new Storehouse();

        //生产者
        Thread producer = new Thread(new Runnable() {
            public void run() {
                for (int i = 0; i < 100; i++) {
                    Random random = new Random();
                    int randomInt = random.nextInt(100);
                    storehouse.put(randomInt);
                }
            }
        });

        //消费者
        Thread consumer = new Thread(new Runnable() {
            public void run() {
                for (int i = 0; i < 100; i++) {
                    storehouse.take();
                }
            }
        });

        producer.start();
        consumer.start();
    }
}

// 仓库
// 生产者生产对象放进仓库、消费者从仓库中消费
class Storehouse {
    int storageSze = 10;
    LinkedList<Object> list = new LinkedList<Object>();

    public synchronized void put(Object object) {
        //判断仓库数量是否已经满了，如果已经满了，那么  生产者  就应该休息。
        while (list.size() == storageSze) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //仓库中没有满，此时生产者将生产的元素放入到仓库中。
        list.add(object);
        System.out.println("生产者生产了一个元素，添加到了仓库中" + object + "。" );
        // 通知消费者来消费
        notify();
    }

    public synchronized void take() {
        //消费者 判断仓库数量是否为0。  如果仓库数量为0， 那么说明已经消费完了，消费者需要休息
        while (list.size() == 0) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //消费者 从仓库中取出了一个元素进行了消费
        System.out.println("消费者从仓库中取出一个元素："+list.poll()+" 进行了消费!!");
        //此时，消费者需要通知生产者继续进行生产。
        notify();
    }
}